<?php
/**
 * 文件类
 * 
 * @package SFramework
 * @author Shuky
 * @since v1.0
 * @version $Id: File.php 82 2010-12-23 18:23:35Z shukyoo@gmail.com $
 */
namespace SFramework;

class File
{
	// 文件夹路径
	protected $_dirPath;
	
	// 文件名
	protected $_fileName;

	// 文件后缀，需要一个默认值
	protected $_suffix;
	
	
	/**
	 * 构建函数可以传入日志文件全路径，也可以只传入文件夹路径，也可以不传
	 */
	public function __construct($filePath = null)
	{
		if ($filePath) {
			// 识别是文件路径还是文件夹路径
			if (strpos($filePath, '.'. $this->getSuffix())) {
				$this->setFilePath($filePath);
			} else {
				$this->setDirPath($filePath);
			}
		}
	}


	/**
	 * 写入日志
	 */
	public function write($content, $filePath = '')
	{
		$filePath = $filePath ? $filePath : $this->getFilePath();
		
		if (!is_dir(dirname($filePath))) {
			$this->createDir(dirname($filePath));
		}
		if (!$handle = fopen($filePath, 'a+b')) {
			throw new SException\CannotReadFile('无法打开文件');
		}
		flock($handle, LOCK_EX);
		if (fwrite($handle, $content) === false) {
			throw new SException\CannotWriteToFile('无法写入内容');
		}
		flock($handle, LOCK_UN);
		fclose($handle);
	}


	/**
	 * 读取日志
	 */
	public function getContent($filePath = '')
	{
		$filePath = $filePath ? $filePath : $this->getFilePath();

		if (!is_file($filePath)) {
			throw new SException\FileNotExists('文件['. $filePath .']不存在');
		}

		return file_get_contents($filePath);
	}


	/**
	 * 设置文件后缀
	 */
	public function setSuffix($suffix)
	{
		if (strpos('a'. $suffix, '.')) {
			$suffix = substr($suffix, strrchr($suffix, '.')+1);
		}
		$this->_suffix = $suffix;
	}


	/**
	 * 设置文件夹路径
	 */
	public function getSuffix()
	{
		return $this->_suffix;
	}


	/**
	 * 设置文件路径
	 */
	public function setFilePath($filePath)
	{
		$this->setDirPath(substr($filePath, 0, strrpos($filePath, '/')));
		$this->setFileName(substr(strrchr($filePath, '/'), 1));
	}


	/**
	 * 获取文件路径
	 */
	public function getFilePath()
	{
		return $this->getDirPath() .'/'. $this->getFileName() .'.'. $this->getSuffix();
	}
	

	/**
	 * 设置文件夹路径
	 */
	public function setDirPath($dirPath)
	{
		$this->_dirPath = $dirPath;
	}


	/**
	 * 获取文件夹路径
	 */
	public function getDirPath()
	{
		if ($this->_dirPath == null) {
			throw new SException\FileNotExists('没有设置日志文件路径');
		}
		return $this->_dirPath;
	}
	
	
	/**
	 * 设置文件名
	 */
	public function setFileName($fileName)
	{
		if (strpos($fileName, '.')) {
			$this->_fileName = substr($fileName, 0, strrpos($fileName, '.'));
			$this->setSuffix(strrchr($fileName, '.'));
		} else {
			$this->_fileName = $fileName;
		}
	}


	/**
	 * 默认以当前日期作为日志名
	 */
	public function getFileName()
	{
		if ($this->_fileName == null) {
			$this->_fileName = date('Y-m-d');
		}
		return $this->_fileName;
	}
	
	
	/**
	 * 递归创建文件夹
	 */
	public function createDir($dirPath, $level = 3)
	{
		if (!is_dir($dirPath) && $level) {
			$this->createDir(dirname($dirPath), $level--);
			if (is_dir(dirname($dirPath))) {
				mkdir($dirPath, 0777);
			} else {
				throw new SException\CannotWriteToFile('创建文件夹失败');
			}
		}
	}
}